﻿// MIT License
// 开源地址：https://gitee.com/co1024/AbcMvc
// Copyright (c) 2021-2022 1024
// Abc.Mvc=Furion+EF+SqlSugar+Pear layui admin.

namespace Abc.Base;

/// <summary>
/// Newtonsoft.Json 扩展
/// </summary>
public static class NewtonsoftJsonExtension
{
    /// <summary>
    /// 序列化为Json字符串（Newtonsoft.Json）
    /// </summary>
    /// <typeparam name="T">对象</typeparam>
    /// <param name="obj">序列化的对象</param>
    /// <returns></returns>
    public static string ToJson2<T>(this T obj)
    {
        var result = Newtonsoft.Json.JsonConvert.SerializeObject(obj, GetDefaultJsonSerializerSettings);
        return result;
    }

    /// <summary>
    /// 反序列化为对象（Newtonsoft.Json）
    /// </summary>
    /// <typeparam name="T">对象</typeparam>
    /// <param name="jsonStr">json字符串</param>
    /// <returns></returns>
    public static T? ToObj2<T>(this string jsonStr)
    {
        if (string.IsNullOrWhiteSpace(jsonStr)) return default(T);
        return Newtonsoft.Json.JsonConvert.DeserializeObject<T>(jsonStr);
    }

    /// <summary>
    /// 默认 Newtonsoft.Json 配置
    /// </summary>
    /// <returns></returns>
    public static JsonSerializerSettings GetDefaultJsonSerializerSettings
    {
        get
        {
            var setting = new JsonSerializerSettings
            {
                //WriteIndented = true,   // 缩进
                //Encoder = JavaScriptEncoder.UnsafeRelaxedJsonEscaping,  // 中文乱码
                //PropertyNameCaseInsensitive = true  // 忽略大小写
                ReferenceLoopHandling = ReferenceLoopHandling.Ignore,//指定如何处理循环引用，None--不序列化，Error-抛出异常，Serialize--仍要序列化
                MissingMemberHandling = MissingMemberHandling.Ignore,//控制在反序列化期间如何处理缺少的成员（例如JSON包含对象上不是成员的属性）。 Ignore 忽略，error 报错
                ContractResolver = new CamelCasePropertyNamesContractResolver(),
                Formatting = Formatting.Indented,//格式化 缩进
                MaxDepth = 10, //设置序列化的最大层数
                NullValueHandling = NullValueHandling.Ignore,//空值处理
                                                             //日期类型默认格式化处理
                DateFormatHandling = Newtonsoft.Json.DateFormatHandling.MicrosoftDateFormat,
                DateFormatString = "yyyy-MM-dd HH:mm:ss",
            };

            return setting;
        }
    }
}